import os
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
from tabulate import tabulate  # 如果没有安装，请使用pip install tabulate

def display_array_content(data, max_rows=None):  # 将max_rows默认设为None表示无限制
    """以表格形式展示数组内容"""
    print("\n==== 数组内容详细展示 ====")
    
    # 检查是否为结构化数组
    if hasattr(data.dtype, 'names') and data.dtype.names:
        # 结构化数组，以表格形式显示
        field_names = data.dtype.names
        print(f"结构化数组字段: {field_names}")
        
        # 限制显示的行数或显示全部
        rows_to_display = len(data) if max_rows is None else min(len(data), max_rows)
        
        # 准备表格数据
        table_data = []
        for i in range(rows_to_display):
            row = [i]  # 行索引
            for field in field_names:
                row.append(data[field][i])
            table_data.append(row)
        
        # 表头
        headers = ["索引"] + list(field_names)
        
        # 使用tabulate打印美观的表格
        try:
            print(tabulate(table_data, headers=headers, tablefmt="grid"))
        except ImportError:
            # 如果没有安装tabulate，使用基本格式输出
            print(" | ".join(headers))
            print("-" * 80)
            for row in table_data:
                print(" | ".join(str(item) for item in row))
        
        # 如果数据超过显示限制，提示还有更多
        if max_rows is not None and len(data) > max_rows:
            print(f"\n... 共有{len(data)}行，仅显示前{max_rows}行 ...")
    else:
        # 非结构化数组
        print(f"非结构化数组，形状: {data.shape}")
        if data.ndim == 1:
            # 一维数组 - 完整显示在方括号中
            np.set_printoptions(threshold=np.inf)  # 设置NumPy打印不限制元素数
            print(data)  # 这会以方括号形式打印整个数组
            np.set_printoptions(threshold=1000)  # 恢复默认设置
        elif data.ndim == 2:
            # 二维数组
            if max_rows is None:
                print(data)  # 显示全部
            else:
                rows = min(data.shape[0], max_rows)
                cols = min(data.shape[1], 10)  # 限制列数
                print(data[:rows, :cols])
                if data.shape[0] > rows or data.shape[1] > cols:
                    print(f"\n... 数组尺寸 {data.shape}，仅显示部分内容 ...")
        else:
            # 多维数组
            print("多维数组，完整显示可能过大:")
            if max_rows is None:
                print(data)  # 显示全部
            else:
                slices = tuple(slice(0, min(5, dim)) for dim in data.shape)
                print(data[slices])
                print(f"\n... 完整数组尺寸: {data.shape} ...")

def inspect_npy_file(file_path):
    """读取并展示NP标签文件的内容"""
    
    # 确认文件存在
    if not os.path.exists(file_path):
        print(f"错误: 文件 {file_path} 不存在!")
        return
        
    # 加载NP文件
    print(f"正在加载文件: {file_path}")
    data = np.load(file_path)
    
    # 显示基本信息
    print("\n==== NPY文件基本信息 ====")
    print(f"文件大小: {os.path.getsize(file_path) / (1024*1024):.2f} MB")
    print(f"数据类型: {data.dtype}")
    print(f"数据形状: {data.shape}")
    print(f"元素数量: {data.size}")
    
    # 以数组形式展示内容
    display_array_content(data, max_rows=None)  # 传递None表示显示全部内容
  
    
    # 可视化数据
    #print("\n==== 尝试可视化数据 ====")
    # try:
    #     if len(data) > 0:
    #         # 检查是否为结构化数组（通常包含t, x, y, w, h, class_id字段）
    #         if hasattr(data.dtype, 'names') and data.dtype.names:
    #             # 绘制边界框位置
    #             plt.figure(figsize=(10, 8))
    #             plt.scatter(data['x'] + data['w']/2, data['y'] + data['h']/2,  # 转为中心点坐标
    #                        s=data['w']*data['h']*0.1,  # 点大小与边界框面积成比例
    #                        alpha=0.6, c=data['class_id'], cmap='tab10')
    #             plt.colorbar(label='类别ID')
    #             plt.title('边界框位置可视化')
    #             plt.xlabel('X坐标')
    #             plt.ylabel('Y坐标')
    #             plt.grid(True)
    #             plt.show()
                
    #             # 可视化时间戳
    #             plt.figure(figsize=(12, 4))
    #             plt.plot(data['t'], 'o-')
    #             plt.title('标签时间戳序列')
    #             plt.xlabel('标签索引')
    #             plt.ylabel('时间戳(微秒)')
    #             plt.grid(True)
    #             plt.show()
                
    #             # 显示时间差
    #             if len(data) > 1:
    #                 diffs = np.diff(data['t'])
    #                 plt.figure(figsize=(12, 4))
    #                 plt.plot(diffs)
    #                 plt.title('时间间隔可视化')
    #                 plt.xlabel('标签索引')
    #                 plt.ylabel('时间差(微秒)')
    #                 plt.grid(True)
    #                 plt.show()
                    
    #             # 分析类别分布
    #             classes, counts = np.unique(data['class_id'], return_counts=True)
    #             plt.figure(figsize=(8, 5))
    #             plt.bar(classes, counts)
    #             plt.title('类别分布')
    #             plt.xlabel('类别ID')
    #             plt.ylabel('数量')
    #             plt.xticks(classes)
    #             plt.grid(axis='y')
    #             plt.show()
    #         else:
    #             print("数据不是结构化数组，无法进行标准可视化")
    # except Exception as e:
    #     print(f"可视化过程出错: {e}")
    
    print("\n检查完成")
    return data

# 使用方法
if __name__ == "__main__":
    # 指定要检查的NPY标签文件路径
    npy_file_path = r"I:\dataset\\nuclear_process\\train\\recording_2024-06-05_10-40-15\\event_representations_v2\stacked_histogram_dt=50_nbins=10\\timestamps_us.npy"
    data = inspect_npy_file(npy_file_path)